package MVC.Controllers;

import MVC.Controller;
import MVC.Models.*;
import MVC.Views.*;
import Resources.Enums.Cor;
import Resources.Enums.Quadrante;
import Resources.Exceptions.*;

public class JogadorController extends Controller {

    /* Views */
    private ApplicationView applicationView = new ApplicationView();
    private TabuleiroView tabuleiroView = new TabuleiroView();

    /* Attributos */
    private Jogador jogador;
    private Tabuleiro tabuleiro;
    private LancePosicao lancePosicao;
    private LanceRotacao lanceRotacao;

    /* Actions */
    public void home() {
        render(applicationView);
    }

    public void conectar(String nome, String servidor) {
        boolean exito = netGamesController.conectar(nome, servidor);

        if (exito) {
            jogador = new Jogador(nome);

            tabuleiro = new Tabuleiro(jogador);

            render(tabuleiroView);
        }
    }

    public void desconectar() {
        boolean exito = netGamesController.desconectar();

        if (exito) {
            tabuleiro = null;

            render(applicationView);
        }
    }

    public void iniciarPartida()  {
        if (tabuleiro.getConectado() && tabuleiro.getEmAndamento()) {
            if(tabuleiroView.confirm("Você tem certeza que deseja parar?"))
                netGamesController.reiniciarPartida();
        } else if (tabuleiro.getConectado() && !tabuleiro.getEmAndamento()) {
            netGamesController.reiniciarPartida();
        } else
            netGamesController.iniciarPartida();
    }

    public void click(Integer linha, Integer coluna) {
        try {
            tabuleiro.click(linha, coluna);
            tabuleiro.inserirPeca(linha, coluna);

            Cor cor = tabuleiro.tratarLance();
            if (cor != null)
                tabuleiro.definirVencedor(cor);
            else {
                boolean cheio = tabuleiro.tratarTabuleiroCheio();
                if (cheio)
                    tabuleiro.definirEmpate();
            }

            lancePosicao = new LancePosicao();
            lancePosicao.setLinha(linha);
            lancePosicao.setColuna(coluna);

            netGamesController.enviarLance(lancePosicao);

            tabuleiroView.refresh();
        } catch (NaoEmAndamentoException e) {
            tabuleiroView.alert(e.getMessage());
        } catch (NaoDaVezException e) {
            tabuleiroView.alert(e.getMessage());
        } catch (JaPosicionouException e) {
            tabuleiroView.alert(e.getMessage());
        } catch (PosicaoOcupadaException e) {
            tabuleiroView.alert(e.getMessage());
        }
    }

    public void clickRotacao(Quadrante quadrante, Boolean horario) {
        try {
            tabuleiro.clickRotacao(quadrante, horario);
            tabuleiro.realizarRotacao(quadrante, horario);

            Cor cor = tabuleiro.tratarLance();
            if (cor != null)
                tabuleiro.definirVencedor(cor);
            else {
                boolean cheio = tabuleiro.tratarTabuleiroCheio();
                if (cheio)
                    tabuleiro.definirEmpate();
                else
                    tabuleiro.proximoJogador();
            }

            lanceRotacao = new LanceRotacao();
            lanceRotacao.setQuadrante(quadrante);
            lanceRotacao.setHorario(horario);

            netGamesController.enviarLance(lanceRotacao);

            tabuleiroView.refresh();
        } catch (NaoEmAndamentoException e) {
            tabuleiroView.alert(e.getMessage());
        } catch (NaoDaVezException e) {
            tabuleiroView.alert(e.getMessage());
        } catch (NaoPosicionouException e) {
            tabuleiroView.alert(e.getMessage());
        }
    }

    /* Getters e Setters */
    public ApplicationView getApplicationView() {
        return applicationView;
    }

    public void setApplicationView(ApplicationView applicationView) {
        this.applicationView = applicationView;
    }

    public TabuleiroView getTabuleiroView() {
        return tabuleiroView;
    }

    public void setTabuleiroView(TabuleiroView tabuleiroView) {
        this.tabuleiroView = tabuleiroView;
    }

    public Jogador getJogador() {
        return jogador;
    }

    public void setJogador(Jogador jogador) {
        this.jogador = jogador;
    }

    public Tabuleiro getTabuleiro() {
        return tabuleiro;
    }

    public void setTabuleiro(Tabuleiro tabuleiro) {
        this.tabuleiro = tabuleiro;
    }

    public LancePosicao getLancePosicao() {
        return lancePosicao;
    }

    public void setLancePosicao(LancePosicao lancePosicao) {
        this.lancePosicao = lancePosicao;
    }

    public LanceRotacao getLanceRotacao() {
        return lanceRotacao;
    }

    public void setLanceRotacao(LanceRotacao lanceRotacao) {
        this.lanceRotacao = lanceRotacao;
    }
}
